// 监听config变化的方法集合
let changeFnList: any[] = [];


const Config: any = {
    // 网站标题
    title: "图文档发布系统",

    // 是否显示连接小眼睛
    isShowLink: true,

    isShowSearchMenu: false,

    homeMenuId: "2009D9HkKkzY8n3oaVyPEXa3",

    rootMenuId: "2009hA1ibf8aHmmNa8Go7w2x",

    // redux state中存储数据的key
    storeKey: "coreSf",

    //本地存储方式 localStorage || cookie
    localDataType: "localStorage",

    localToken: "accessToken",

    localLang: "i18nextLng",

    localIcon: "typeIconMap",

    localFileSuffix: "fileSuffixMap",

    axiosSerMenuKey: "sfAuthMenu",

    // 是否开启http缓存 视图，菜单 一般开发环境设置false， 正式环境设置true
    cache: true,

    // 表格默认展示条数
    pageSize: 50,

    numberStep: 100,

    routerComponent: null,

    // form 中 Descriptions 子元素的布局设置 方案列表
    formLayoutList: {
        5: {xxl: 5, xl: 5, lg: 5, md: 2, sm: 1, xs: 1},
        4: {xxl: 4, xl: 3, lg: 3, md: 3, sm: 2, xs: 1},
        3: {xxl: 3, xl: 3, lg: 3, md: 3, sm: 2, xs: 1},
        2: {xxl: 2, xl: 2, lg: 2, md: 2, sm: 2, xs: 1},
        1: {xxl: 1, xl: 1, lg: 1, md: 1, sm: 1, xs: 1}
    },

    form: {
        // form中子元素的布局设置 方案列表
        layoutList: {
            1: {xs: 24},
            2: {xs: 24, lg: 12},
            3: {xs: 24, lg: 12, xl: 8},
            4: {xs: 24, lg: 12, xl: 8, xxl: 6},
            // 6列状态 尽量不要用
            // 6: {xs: 24, md: 12, lg: 8, xl: 6, xxl: 4}
        },
        // formItem lable 和 输入组件区域 布局设置
        itemLayoutList: {
            // label和输入组件各占一行
            1: {
                labelCol: {
                    xs: {span: 24},
                    sm: {span: 24}
                },
                wrapperCol: {
                    xs: {span: 24},
                    sm: {span: 24}
                }
            },
            // label和输入组件在同一行显示
            2: {
                labelCol: {
                    xs: {span: 24},
                    sm: {span: 7}
                },
                wrapperCol: {
                    xs: {span: 24},
                    sm: {span: 17}
                }
            },
            // label和输入组件在同一行显示 label部分加宽 英文模式下使用
            3: {
                labelCol: {
                    xs: {span: 24},
                    sm: {span: 9}
                },
                wrapperCol: {
                    xs: {span: 24},
                    sm: {span: 15}
                }
            },
        },
        // formItem默认布局方式
        defaultItemLayout: 2,
        // formItem英文默认布局方式
        defaultEnItemLayout: 3,
        // form子元素默认使用方案 DataForm有使用
        defaultLayout: 1,
        // 基本信息界面默认使用的form布局
        baseInfoLayout: 4,
        // 弹出对话框搜索form默认布局
        modalSearchLayout: 2,
    },

    // 时间格式化
    dateFormat: {
        time: "YYYY-MM-DD HH:mm:ss",
        date: "YYYY-MM-DD",
        week: "YYYY-wo",
        month: "YYYY-MM",
        quarter: "YYYY-Q",
        year: "YYYY",
    }
};

export default Config;

function execuChange(newConfig: object, oldConfig: object) {
    changeFnList.forEach(item => item(newConfig, oldConfig));
}

/**
 * 覆盖Config
 * @param newConfig 新的config配置，会与旧的config进行合并覆盖
 */
export function setConfig(newConfig: object) {
    const oldConfig = {...Config};
    Object.assign(Config, newConfig);
    execuChange(Config, oldConfig);
}

/**
 * 监听Config的变化 方法, 用于在初始化时 获取可能在分支项目中修改的配置项
 * @param fn
 */
export function configChange(fn: Function) {
    if (fn) {
        changeFnList.push(fn);
        fn(Config);
    }
}